package cn.tedu.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Type;

/*
Author     :Dsi
Date       : 2021/11/22 17:01
Description: 该类用于注解的学习---自定义注解
*/
public class TestAnnotation {

}
//2.通过Target注解标注注解使用的位置
@Target({ElementType.TYPE,ElementType.METHOD})
/*3.通过@Target元注解规定自定义注解的位置
* 我们使用ElemType.静态常量“的格式来指定自定义注解需要加在什么位置
* 这里的值可以用集合些多个{}隔开，格式：@Target{ElementsType.Method，ElementType.TYPE}*/
//3.通过@Retention注解标注自定义注解的生命周期，指能存活到什么时候
@Retention(RetentionPolicy.RUNTIME)//到运行时都有效
/*4.我们通过@Retention元注解规定自定义注解的生命周期，使用 “Retention.静态常量” 的方式来指定自定义注解的生命周期
* 注意：这个值只能写一个:SOURCE,CLASS,RUNTIME 3选1*/
//1.定义自定义注解
/*1.首先注意：定义注解的语法与Java不同
* 2.定义注解的格式：@interface 注解名*/
@interface Rice {
    //5.给自定义注解进行功能性的增强--添加注解的属性
    /*5.注意：int age（）不是方法的定义，而是给注解添加了age的属性*/
    //int age();//给Rice注解添加了一个普通的int类型的age属性
    int age() default 0;
    //6.给自定义注解添加特殊属性value
    /*6.特殊属性的定义方式和默认赋值与普通方法一样
    * 但注意：特殊属性的名字必须是value，类型不做限制*/
    //String value();//定义一个特殊属性value，类型是String
    String value() default "Apple";//定义一个特殊属性，类型是String

}
//@Rice
class TestAnno{
    /*1.测试一：分别给TestAnno类/name属性/eat方法分别添加Rice注解
    * 结论：属性上的注解报错，说明自定义注解加在什么位置，由@Target决定*/
    //@Rice
    String name ;
    /*测试2.当我们给Rice注解添加一个age属性时，报错
    * 结论：当注解没有定义属性时，可以直接使用
    *       当注解被定义属性时，注解不能直接使用，必须给属性赋值*/
    /*测试3：给注解的属性age赋予默认值以后，就可以直接使用Rice注解了
    * 不需要给age属性赋值，此时age属性的默认值就是0*/
    /*4.测试4：给Rice注解添加特殊属性value后，必须给属性赋值
    * 不过这种赋值可以简写成：@Rice（“sa“）*/
    /*5.测试5：如果特殊属性被赋予默认值，可以简写
    但注意：如果要给注解所有属性，两种属性都不能简写*/
    //@Rice(10)//报错，普通属性赋值时不可以简写
    //@Rice(age = 10)
    //@Rice("Apple")
    //@Rice//不报错，String// 属性已被赋予被默认值

    @Rice(age = 10,value = "Bannana")
    public void ert(){
        System.out.println("现在只想吃饭！~");
    }
}